package ntd.util.config.common.enums;

import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.StaticLog;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;

/**
 * 数据类型
 * mysql 数据库类型映射枚举
 */
@AllArgsConstructor
public enum EnumDataType implements BaseEnumInterface {

    TEXT("文本"),
    NUMBER("数值"),
    DATE("时间"),
    BOOLEAN("布尔"),
    ENUM("枚举"),
    ARRAY("数组"),
    ;

    @Getter
    private String name;

    @Override
    public String getValue() {
        return this.name();
    }

    private static Map<String, EnumDataType> dataTypeMap = new HashMap<String, EnumDataType>() {{
        put("varchar", EnumDataType.TEXT);
        put("text", EnumDataType.TEXT);
        put("longtext", EnumDataType.TEXT);
        put("mediumtext", EnumDataType.TEXT);
        put("bit", EnumDataType.TEXT);
        put("int", EnumDataType.NUMBER);
        put("decimal", EnumDataType.NUMBER);
        put("tinyint", EnumDataType.NUMBER);
        put("bigint", EnumDataType.NUMBER);
        put("double", EnumDataType.NUMBER);
        put("timestamp", EnumDataType.DATE);
        put("datetime", EnumDataType.DATE);
        put("date", EnumDataType.DATE);
    }};

    public static EnumDataType transform(String type) {
        if (StrUtil.isBlank(type)) {
            return null;
        }
        EnumDataType enumDataType = dataTypeMap.get(type.toLowerCase());
        if (ObjectUtil.isNull(enumDataType)) {
            enumDataType = EnumUtil.getBy(EnumDataType.class, enumDataType1 -> enumDataType1.name().equals(type));
        }
        if (ObjectUtil.isNull(enumDataType)) {
            StaticLog.info("未匹配的类型 - " + type);
            enumDataType = EnumDataType.TEXT;
        }
        return enumDataType;
    }
}
